#include <functional>
#include<iostream>
#include<memory>
#include "InetAddr.hpp"
#include "Log.hpp"
#include"UdpServer.hpp"
#include"ThreadPool.hpp"
#include"Route.hpp"

using namespace LogModule;

using namespace ThreadPoolModule;

using task_t = std::function<void()>;

//  传port端口  
int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        std::cerr<<"Usage: "<<argv[0]<<"port"<<std::endl;
    }
    uint16_t port = std::stoi(argv[1]);
    Enable_Console_Log_Strategy();

    //  1.路由服务
    Route r;

    //  2.线程池 
    auto tp = ThreadPool<task_t>::GetInstance();

    std::unique_ptr<UdpServer> usvr = std::make_unique<UdpServer>(port, [&r,&tp](int sockfd, const std::string& message, InetAddr& peer){
        task_t t = std::bind(&Route::MessageRoute,&r,sockfd, message, peer);
        tp->Equeue(t);
    });

    usvr->Init();
    usvr->Start();
    return 0;
}